/* * Copyright (c) 2016, PostgreSQL Global Development Group * See the LICENSE file in the project root for more information. */ package org.postgresql.replication; import static org.hamcrest.CoreMatchers.equalTo; import static org.hamcrest.MatcherAssert.assertThat; import org.postgresql.PGConnection; import org.postgresql.PGProperty; import org.postgresql.test.TestUtil; import org.postgresql.test.util.rules.annotation.HaveMinimalServerVersion; import org.hamcrest.CoreMatchers; import org.junit.After; import org.junit.Before; import org.junit.Test; import java.sql.Connection; import java.sql.ResultSet; import java.sql.Statement; import java.util.Properties; @HaveMinimalServerVersion("9.4") public class ReplicationConnectionTest { private Connection replConnection; @Before public void setUp() throws Exception { replConnection = openReplicationConnection(); //DriverManager.setLogWriter(new PrintWriter(System.out)); } @After public void tearDown() throws Exception { replConnection.close(); } @Test public void testIsValid() throws Exception { boolean result = replConnection.isValid(3); PGConnection connection = (PGConnection) replConnection; connection.getBackendPID(); assertThat("Replication connection as Simple connection can be check on valid", result, equalTo(true) ); } @Test public void testConnectionNotValidWhenSessionTerminated() throws Exception { int backendId = ((PGConnection) replConnection).getBackendPID(); Connection sqlConnection = TestUtil.openDB(); Statement terminateStatement = sqlConnection.createStatement(); terminateStatement.execute("SELECT pg_terminate_backend(" + backendId + ")"); terminateStatement.close(); sqlConnection.close(); boolean result = replConnection.isValid(3); assertThat("When postgresql terminate session with replication connection, " + "isValid methos should return false, because next query on this connection will fail", result, equalTo(false) ); } @Test public void testReplicationCommandResultSetAccessByIndex() throws Exception { Statement statement = replConnection.createStatement(); ResultSet resultSet = statement.executeQuery("IDENTIFY_SYSTEM"); String xlogpos = null; if (resultSet.next()) { xlogpos = resultSet.getString(3); } resultSet.close(); statement.close(); assertThat("Replication protocol supports a limited number of commands, " + "and it command can be execute via Statement(simple query protocol), " + "and result fetch via ResultSet", xlogpos, CoreMatchers.notNullValue() ); } @Test public void testReplicationCommandResultSetAccessByName() throws Exception { Statement statement = replConnection.createStatement(); ResultSet resultSet = statement.executeQuery("IDENTIFY_SYSTEM"); String xlogpos = null; if (resultSet.next()) { xlogpos = resultSet.getString("xlogpos"); } resultSet.close(); statement.close(); assertThat("Replication protocol supports a limited number of commands, " + "and it command can be execute via Statement(simple query protocol), " + "and result fetch via ResultSet", xlogpos, CoreMatchers.notNullValue() ); } private Connection openReplicationConnection() throws Exception { Properties properties = new Properties(); PGProperty.ASSUME_MIN_SERVER_VERSION.set(properties, "9.4"); PGProperty.REPLICATION.set(properties, "database"); //Only symple query protocol available for replication connection PGProperty.PREFER_QUERY_MODE.set(properties, "simple"); return TestUtil.openDB(properties); } }